package com.me.study.javaCore.io;

import org.springframework.core.io.ClassPathResource;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 测试各种 Java API 的文件路径以哪个目录为相对路径，jar包里的文件只能通过 getResourceAsStream 读取： <p></p>
 *
 * TODO
 *  1，this.class.getResource("")	                    以 "/" 开头就是以 classpath 为相对路径，没有 “/” 就是以类对象所在的包为相对路径 <p>
 *  2，this.class.getClassLoader().getResource("")	    不带 "/" 以 classpath 为相对路径。并且不能以 "/" 开头 <p>
 *  3，new ClassPathResource("test-file.txt")	        Spring ClassPathResource 带不带 "/" 都以 classpath 为相对路径 <p>
 *  4，Paths.get() 以 `user.dir` 为相对路径，本地项目中表示根目录。Tomcat 中 表示的 tomcat根目录。 <p>
 *       并且 Junit 以当前模块为根目录，main 是项目根目录。  <p>
 *  5，其他获取文件的方式 new File()、Paths.get()、new FileInputStream、new FileOutputStream 等	以 `user.dir` 为相对路径，也就是 java 项目根目录，在 Tomcat 中 表示的 tomcat根目录
 *
 * @author ME
 * @date 2021/5/13
 */
public class TestFilePath {

    public static void main(String[] args) throws Exception {
        // 以 "/" 开头的 path 才以 classpath 为相对路径
        // sun.misc.Launcher$AppClassLoader
        URL url = TestFilePath.class.getResource("/test-file.txt");
        System.out.println("class.getResource url：\n\t" + url);
        System.out.println("class.getResource url.getPath()：\n\t" + url.getPath());
        System.out.println("class.getResource url.getFile()：\n\t" + url.getFile());

        // 非 "/" 开头的 以类对象所在的包为相对路径
        url = TestFilePath.class.getResource("file-path.txt");
        System.out.println("class.getResource：（非 `/`开头以指定类所在的包为相对路径）\n\t" + url);

        // spring ClassPathResource 带不带 "/" 都以 classpath 为相对路径
        url = new ClassPathResource("/test-file.txt").getURL();
        System.out.println("\nSpring ClassPathResource：\n\t" + url);

        // sun.misc.Launcher$AppClassLoader
        // ClassLoader().getResource("")	    默认以 classpath 为相对路径。以 "/" 开头则为磁盘根目录为相对路径，然而没找到目录哦
        url = TestFilePath.class.getClassLoader().getResource("test-file.txt");
        System.out.println("\nclassLoader.getResource：（非 `/`开头则表示 classpath目录）\n\t" + url);
        url = TestFilePath.class.getClassLoader().getResource("/");
        System.out.println("classLoader.getResource：（`/`开头匹配不到目录）\n\t" + url);

        // ClassLoader().getResource("")	    默认以 classpath 为相对路径。
        url = Thread.currentThread().getContextClassLoader().getResource("test-file.txt");
        System.out.println("\nContextClassLoader.getResource：\n\t" + url);

        // ClassLoader().getResource("")	    默认以 classpath 为相对路径。
        url = ClassLoader.getSystemClassLoader().getResource("test-file.txt");
        System.out.println("\nSystemClassLoader().getResource：\n\t" + url);

        System.out.println("\nPaths.get() 和 new File() 都是以 `user.dir` 为相对路径（也就是项目根目录）：" + System.getProperty("user.dir"));
        Path path = Paths.get("testJDK8/target/classes/test-file.txt");
        System.out.println("Paths.get() 相对路径：\n\t" + path.toUri().toString());
        path = Paths.get("/testJDK8/target/classes/test-file.txt");
        System.out.println("Paths.get() 绝对路径：\n\t" + path.toUri().toString());

        File file = new File("testJDK8/target/classes/test-file.txt");
        System.out.println("\nnew File() 相对路径：\n\t" + file.getAbsolutePath());
        file = new File("/testJDK8/target/classes/test-file.txt");
        System.out.println("\nnew File() 绝对路径：\n\t" + file.getAbsolutePath());

        BufferedReader reader = new BufferedReader(new FileReader(Thread.currentThread().getContextClassLoader().getResource("test-file.txt").getPath()));
        System.out.println("\n" + reader.readLine());

    }

}
